home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000
/
Ham Radio 2000.iso
/
ham2000
/
satellit
/
pbsv004
/
pbkiss.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-05
|
5KB
|
298 lines
/* pbkiss.c 1993.8.6 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
/* #include <conio.h> */
#include <memory.h>
#include "pbsv.h"
/* KISS TNC control */
#define KISS_DATA 0
#define KISS_TXD 1
#define KISS_P 2
#define KISS_ST 3
#define KISS_TXT 4
#define KISS_FD 5
#define KISS_HW 6
#define KISS_KPC_2 0x10
#define KISS_RETURN 0xff
#define FEND 0300 /* Frame End */
#define FESC 0333 /* Frame Escape */
#define TFEND 0334 /* Transposed frame end */
#define TFESC 0335 /* Transposed frame escape */
extern VOID timer(); /* pbsv.c */
extern BOOL f_hex,f_header;
/* kiss mode parm */
extern int txd,persist,slottime,txtail;
extern int fullduplex,sethardware,softdcd;
extern int port;
extern int kissrom;
extern int multikiss;
extern clock_t tim_1;
extern int initrs(int); /* pbrs232c.c */
extern int rsgetc(int),rsputc(int,char);
extern int rsputs(int,char*);
extern BOOL check_port(int);
BOOL f_rkss = OFF;
int lnrkss;
char rkss[FRMSIZE];
BOOL f_skss = OFF; /* send req flag */
int lnskss; /* send frame length */
char skss[FRMSIZE];
/*
* < inikss > initialize KISS mode
*/
VOID inikss()
{
VOID montnc(int),kissparm(int,int);
int r;
r = initrs(port); /* init RS232C */
switch(r) {
case 1:
printf("OK port[COM%d]\n",port+1);
if (kissrom == 0) {
rsputs(port,"\r");
montnc(1);
printf("KISS ON\n");
rsputs(port,"KISS ON\r");
montnc(1);
printf("RESTART\n");
rsputs(port,"RESTART\r");
montnc(4);
printf("\n");
if (txd != NOT_DEFINE)
kissparm(1,txd/10);
if (persist != NOT_DEFINE)
kissparm(2,persist/10);
if (slottime != NOT_DEFINE)
kissparm(3,slottime/10);
if (txtail != NOT_DEFINE)
kissparm(4,txtail/10);
kissparm(5,fullduplex);
kissparm(6,sethardware);
kissparm(7,softdcd);
}
break;
case 2:
printf("Error: port not active[COM%d]\n",port+1);
exit(1);
/* NOT REACHED */
case 3:
printf("Error: COMBIOS not exist[COM%d]\n",port+1);
exit(1);
/* NOT REACHED */
default:
break;
}
}
/*
* < exitkss > exit KISS mode
*/
VOID exitkss()
{
VOID montnc(int);
if (kissrom == 0) {
rsputc(port,(char)0xff);
rsputc(port,(char)0xc0);
rsputc(port,(char)0xff);
montnc(4);
printf("\n");
}
}
/*
* < montnc > monitor TNC
*/
VOID montnc(int t)
{
int c;
timer();
for (tim_1 = t; tim_1 > 0;) {
timer();
if (check_port(port)) {
c = rsgetc(port);
if (c == '\r')
putch('\n');
putch(c);
}
}
}
/*
* < rcvkss > recive KISS frame
*/
VOID rcvkss()
{
VOID hexdump();
static int seq = 0;
int c;
if (!check_port(port))
return;
c = rsgetc(port);
switch(seq) {
case 0:
f_rkss = OFF;
lnrkss = 0;
if (c == FEND)
seq++;
break;
case 1:
if (c == FEND) {
if (lnrkss > 0) {
f_rkss = ON;
seq = 0;
if (f_hex) {
hexdump(rkss,lnrkss);
}
break;
}
} else if (c == FESC) {
seq++;
} else {
if (lnrkss >= FRMSIZE) {
seq = 0;
break;
}
rkss[lnrkss++] = c;
}
break;
case 2:
if (c == TFEND) {
c = FEND;
} else if (c == TFESC) {
c = FESC;
} else {
seq = 0;
break;
}
if (lnrkss >= FRMSIZE) {
seq = 0;
break;
}
rkss[lnrkss++] = c;
seq--;
break;
default:
break;
}
return;
}
/*
* < sndkss > send KISS frame
*/
VOID sndkss()
{
VOID hexdump();
int i,c;
if (f_hex) {
hexdump(skss,lnskss);
}
rsputc(port,(char)FEND);
for (i = 0; i < lnskss; i++) {
c = skss[i];
switch(c) {
case FEND:
rsputc(port,(char)FESC);
rsputc(port,(char)TFEND);
break;
case FESC:
rsputc(port,(char)FESC);
rsputc(port,(char)TFESC);
break;
default:
rsputc(port,(char)c);
break;
}
}
rsputc(port,(char)FEND);
}
/*
* < kissparm > KISS mode parm
*/
VOID kissparm(cmd,parm)
int cmd,parm;
{
if (parm == NOT_DEFINE)
return;
skss[0] = (multikiss<<4) | (cmd & 0x0f);
skss[1] = parm;
lnskss = 2;
sndkss();
}
/*
* < hexdump > Hex dump display
*/
VOID hexdump(p,n)
u_char p[];
int n;
{
static char *buf =
"000: 00010203 04050607 08090A0B 0C0D0E0F 0123456789ABCDEF 0123456789ABCDEF";
char tmp[5];
int c,c2,i,j,p1;
for (i = j = 0; i < n; i++) {
if (j == 0) {
memset(buf,' ',74);
buf[74] = '\0';
sprintf(tmp,"%03X:",i);
memcpy(buf,tmp,4);
p1 = 5;
}
c = p[i];
c2 = c>>1;
sprintf(tmp,"%02X",(c & 0xff));
memcpy(buf+p1,tmp,2);
p1 += 2;
if ((j&3) == 3)
p1++;
if (!isprint(c2))
c2 = '.';
buf[j+41] = c2;
if (!isprint(c))
c = '.';
buf[j+58] = c;
if (++j == 16) {
j = 0;
printf("%s\n",buf);
}
}
if (j != 0)
printf("%s\n",buf);
}
/* pbkiss.c */